#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"

void Serial_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef gitd;
    gitd.GPIO_Mode = GPIO_Mode_AF_PP;
    gitd.GPIO_Pin = GPIO_Pin_9;
    gitd.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gitd);

    USART_InitTypeDef uitd;
    uitd.USART_BaudRate = 9600;
    uitd.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    uitd.USART_Mode = USART_Mode_Tx;
    uitd.USART_Parity = USART_Parity_No;
    uitd.USART_StopBits = USART_StopBits_1;
    uitd.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART1, &uitd);

    USART_Cmd(USART1, ENABLE);
}

void Serial_SendByte(uint8_t Byte)
{
    USART_SendData(USART1, Byte);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) ;
}

void Serial_SendArray(uint8_t *Bytes, uint16_t Length)
{
    uint16_t i = 0;
    while (i < Length)
    {
        /* code */
        Serial_SendByte(Bytes[i]);
        i++;
    }
    
}

void Serial_SendString(uint8_t *String)
{
    uint16_t i = 0;
    for (i = 0; String[i] != '\0'; i++){
        /* code */
        Serial_SendByte(String[i]);
    }    
}

// int fputc(int ch, FILE *f)
// {
// 	Serial_SendByte(ch);			//将printf的底层重定向到自己的发送字节函数
// 	return ch;
// }